package com.hf.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hf.entity.Modules;
import com.hf.entity.RoleModules;
import com.hf.mapper.ModulesMapper;
import com.hf.mapper.RoleModulesMapper;
import com.hf.service.IModulesService;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author eight
 * @since 2021-06-06
 */
@Service
public class ModulesServiceImpl extends ServiceImpl<ModulesMapper, Modules> implements IModulesService {
	@Autowired
	ModulesMapper modulesMapper;
	@Autowired
	RoleModulesMapper roleModulesMapper;
	// 需要设置为true的模块id集合
	List<Integer> moduleIds = null;

	@Override
	public List<Modules> getModulesTree() {
		moduleIds = null;
		// 获取所有的模块（平查）
		List<Modules> list = modulesMapper.selectList(null);
		// 声明一个集合用来保存结果
		List<Modules> tree = new ArrayList<>();
		// 遍历集合，判断模块的父节点是否为0，若是，则此模块是根节点
		for (Modules m : list) {
			if (m.getParentId() != null && m.getParentId() == 0) {
				tree.add(findChildren(m, list));
			}
		}
		return tree;
	}

	/**
	 * 1递归查询子模块
	 * 
	 * @param m    当前节点
	 * @param list 所有节点
	 * @return
	 */
	public Modules findChildren(Modules m, List<Modules> list) {
		for (Modules item : list) {
			if (moduleIds != null && moduleIds.contains(item.getId()) && item.getParentId() != 0
					&& item.getChildren() == null) {
				item.setChecked(true);
			}

			if (m.getId() == item.getParentId()) {
				if (m.getChildren() == null) {
					m.setChildren(new ArrayList<Modules>());
				}
				m.getChildren().add(findChildren(item, list));
			}
		}
		return m;
	}

	/**
	 * 获取所有模块--根据角色id勾选该角色所拥有的的模块
	 */
	@Override
	public List<Modules> getModulesTreeByRoleId(Integer rid) {
		moduleIds = new ArrayList<Integer>();
		// 获取所有的模块（平查）
		List<Modules> list = modulesMapper.selectList(null);
		// 声明一个集合用来保存结果
		List<Modules> tree = new ArrayList<>();
		// 勾选该角色拥有的模块
		QueryWrapper<RoleModules> q = new QueryWrapper<RoleModules>();
		q.eq("role_id", rid);
		List<RoleModules> selectList = roleModulesMapper.selectList(q);
		for (RoleModules r : selectList) {
			moduleIds.add(r.getModuleId());
		}
		// 遍历集合，判断模块的父节点是否为0，若是，则此模块是根节点
		for (Modules m : list) {
			if (m.getParentId() != null && m.getParentId() == 0) {
				tree.add(findChildren(m, list));
			}
		}
		return tree;
	}

	/**
	 * 根据userId获取该用户拥有的模块（登录后展示相关信息）
	 */
	@Override
	public List<Modules> getModulesTreeByUserId(Integer userId) {
		// 根据用户id获取模块列表
		List<Modules> list = modulesMapper.getModulesTreeByUserId(userId);
		// 声明一个集合用来保存结果
		List<Modules> tree = new ArrayList<>();
		// 遍历集合，判断模块的父节点是否为0，若是，则此模块是根节点
		for (Modules m : list) {
			if (m.getParentId() != null && m.getParentId() == 0) {
				tree.add(findChildren(m, list));
			}
		}
		return tree;
	}
}
